package fiuba.dao.hibernate;

import java.util.ArrayList;
import org.hibernate.*;
import java.util.List;

import fiuba.dao.hibernate.GenericDaoHibernate;
import fiuba.model.LabelValue;
import fiuba.model.Menu;
import fiuba.model.MenuItem;
import fiuba.model.Noticia;
import fiuba.dao.NoticiaDao;
import org.hibernate.Query;
import org.hibernate.Session;


public class NoticiaDaoHibernate extends GenericDaoHibernate<Noticia, Long> 
		implements NoticiaDao {

	    public NoticiaDaoHibernate() {
	        super(Noticia.class);
	    }
	    
		public List<Noticia> findSinKeywords(){
			return getHibernateTemplate().find("from Noticia");			
		}
		public List<Noticia> findVigentes(){
			return getHibernateTemplate().find("from Noticia n WHERE n.fechaBaja = null order by n.id desc");			
		}
		public List<Noticia> findNoVigentes(){
			return getHibernateTemplate().find("from Noticia n WHERE n.fechaBaja <> null");			
		}
		
		public List<Noticia> findConLimit(int page, int pageSize){
			Session session = this.getSession();
	        Query query = session.createQuery("from Noticia n WHERE n.fechaBaja = null AND n.publicada = true  order by n.id desc");
	        query.setFirstResult((page - 1) * pageSize);
	        query.setMaxResults(pageSize);
	        List<Noticia> ret = query.list();
	        return ret;
		}
		
		
	    public List<Noticia> findConLimitYSeccion (int page, int pageSize, String secciones){
			Session session = this.getSession();
	        Query query = session.createQuery("from Noticia n WHERE n.fechaBaja = null AND n.publicada = true AND n.seccion IN ("
	        		+ secciones + ")  order by n.id desc");
	        query.setFirstResult((page - 1) * pageSize);
	        query.setMaxResults(pageSize);
	        List<Noticia> ret = query.list();
	        return ret;
	    }
	    
	    
		public List<Noticia> findConBusqueda(List<Long> secciones, List<String> palabras, int page, int pageSize){
			String query = "from Noticia n WHERE n.fechaBaja = null AND n.publicada = true";
			String querySecciones = "";
			// Agregar secciones
			for (Long idseccion : secciones) {
				if (!querySecciones.equals("")) {
					querySecciones = querySecciones + " OR ";
				}
				querySecciones = querySecciones + " n.seccion = " + idseccion;
			}
			if (! querySecciones.equals("")) {
				query = query + " AND (" + querySecciones + ")";
			}
			// Agregar Palabras
			String queryTexto = "";
			for (String palabra : palabras) {
				if (!queryTexto.equals("")) {
					queryTexto = queryTexto + " OR ";
				}
				queryTexto = queryTexto + " n.contenido LIKE '%" + palabra + "%' OR"
					+ " n.resumen LIKE '%" + palabra + "%' OR n.titulo LIKE '%" + palabra + "%'";
			} 
			if (! queryTexto.equals("")) {
				query = query + " AND (" + queryTexto + ")";
			}
			
			query = query + " order by n.fechaCreacion desc";
			// Ejecutar la consulta
			Session session = this.getSession();
	        Query queryobj = session.createQuery(query);
	        queryobj.setFirstResult((page - 1) * pageSize);
	        queryobj.setMaxResults(pageSize);
	        List<Noticia> ret = queryobj.list();
	        return ret;
		}
		
		// Devuelve la cantidad de paginas totales
		public int countConBusqueda(List<Long> secciones, List<String> palabras, int pageSize){
			String query = "select count(*) from Noticia n WHERE n.fechaBaja = null AND n.publicada = true";
			String querySecciones = "";
			// Agregar secciones
			for (Long idseccion : secciones) {
				if (!querySecciones.equals("")) {
					querySecciones = querySecciones + " OR ";
				}
				querySecciones = querySecciones + " n.seccion = " + idseccion;
			}
			if (! querySecciones.equals("")) {
				query = query + " AND (" + querySecciones + ")";
			}
			// Agregar Palabras
			String queryTexto = "";
			for (String palabra : palabras) {
				if (!queryTexto.equals("")) {
					queryTexto = queryTexto + " OR ";
				}
				queryTexto = queryTexto + " n.contenido LIKE '%" + palabra + "%' OR"
					+ " n.resumen LIKE '%" + palabra + "%' OR n.titulo LIKE '%" + palabra + "%'";
			} 
			if (! queryTexto.equals("")) {
				query = query + " AND (" + queryTexto + ")";
			}

			Session session = this.getSession();
            Query q = session.createQuery(query);
            Transaction tx = session.beginTransaction();
            Long count = (Long)q.uniqueResult();
            Double division = new Double(Math.ceil(count/pageSize));
            int paginas = division.intValue();
            if (paginas == 0) paginas = 1;
	        return paginas;
		}
	    
}
